#include <butil/logging.h>
#include <brpc/server.h>


namespace chenrpc
{

using ChannelPtr = std::shared_ptr<brpc::Channel>;
class Channels
{
public:
    uing ptr = std::shared_ptr<Channels>;
    Channels();
    ~Channels();

    //1,新增节点
    void insert(std::string& addr);
    //2,获取节点
    ChannelPtr select();
    //3,删除节点
    void remove(const std::string& addr);


private:
    std::mutex _mtx;
    uint32_t _idx; //轮询下标
    std::vector<ChannelPtr> _channels;
    std::unordered_map<std::string, ChannelPtr> _maps; //ip --- brpc服务信道
};

class SvcChannels
{
public:
    SvcChannels();
    ~SvcChannels();

    void setWatch(std::string& svc_name);
    void addNode(std::string& svc_name, std::string& addr);
    void delNode(std::sring& svc_name, std::string& addr);
    ChannelPtr getNode(std::string& svc_name);

private:
    std::mutex _mtx;
    std::unordered_map<std::string, Channels::ptr> _maps; //服务名 --- 信道
};

//Closure封装设计： 给使用者提供一个函数/仿函数对象，我们返回一个Closure对象即可。
class ClosureFactor
{
public:
    using callback_t = std::function<void()>;
    static google::protobuf::Closure* create(callback_t&& cb)
    
private:
    struct Object{
        using ptr = std::shared_ptr<Object>;
        callback_t callback;
    };
    void asyncCallback(const Object::ptr obj);
};

class RpcSererFactory
{
    public:
    //默认service是从堆上new出来的对象，将管理权移交给rpc服务器进行管理
    static std::shared_ptr<brpc::Server> create(int port, google::protobuf::Service* service);
    

};

}